home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsQUICKIN.rexx < prev    next >
OS/2 REXX Batch file  |  1994-12-23  |  31KB  |  1,222 lines

  1. /* $VER: bbsQUICKIN.rexx 8.3 (23.12.94)
  2. Copyright ⌐ 1993-94 Richard Lee Stockton
  3. FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS 
  4.  
  5. Processes archive "QUICKIN.lha" in user's emailfiles, which
  6. should have been made by bbsQUICK.rexx, the offline reader.
  7. Handles incoming mail, messages, downloads, and uploads.
  8. Also handles some sysop and super-sysop offline functions.
  9. */
  10.  
  11. CR='0D'x
  12. LF='0A'x
  13. SIGNAL ON ERROR
  14. SIGNAL ON SYNTAX
  15. SIGNAL ON BREAK_C
  16. SIGNAL ON FAILURE
  17.  
  18. ARG name level sysoplevel accessflag .
  19.  
  20. fromcli=0
  21. figarg='s:CONFIG.BBS'
  22. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  23. x=OPEN(f,figarg,'R')
  24. IF x=0 THEN
  25.   DO
  26.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  27.     CALL GETOUT(20)
  28.   END
  29. lynes.=''
  30. DO i=1 TO 31
  31.   lynes.i=READLN(f)
  32. END
  33. CALL CLOSE(f)
  34. compos=POS('/*',lynes.1)
  35. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  36. bbsname=STRIP(lynes.1)
  37. sysop=WORD(lynes.2,1)
  38. calls=WORD(lynes.31,1)
  39. IF name='' THEN
  40.   DO
  41.     bbspath=WORD(lynes.6,1)
  42.     IF RIGHT(bbspath,1)~=':' & RIGHT(bbspath,1)~='/' THEN bbspath=bbspath'/'
  43.     msgpath=WORD(lynes.7,1)
  44.     IF RIGHT(msgpath,1)~=':' & RIGHT(msgpath,1)~='/' THEN msgpath=msgpath'/'
  45.     libpath=WORD(lynes.8,1)
  46.     IF RIGHT(libpath,1)~=':' & RIGHT(libpath,1)~='/' THEN libpath=libpath'/'
  47.     name=sysop
  48.     IF ~EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  49.       DO
  50.         SAY bbspath'EmailFiles/'name'/QUICKIN.lha does not exist!'
  51.         CALL GETOUT(21)
  52.       END
  53.     level=99
  54.     sysoplevel=99
  55.     accessflag=0
  56.     fromcli=1
  57.   END
  58. ELSE
  59.   DO
  60.     bbspath=GETCLIP('BBS_path')
  61.     msgpath=GETCLIP('BBS_msgpath')
  62.     libpath=GETCLIP('BBS_libpath')
  63.   END
  64. IF WORD(lynes.25,1)=1 THEN scratch=bbspath'Scratch'
  65. ELSE scratch='RAM:Scratch'
  66.  
  67. /* Wait 10 mins for QUICKOUT process (started by this user) to finish */
  68.  
  69. DO i=1 TO 100 WHILE GETCLIP('BBS_'name)='QUICK'
  70.   CALL DELAY(300)
  71. END
  72.  
  73. /* Only one QUICKIN process at a time per user */
  74.  
  75. IF GETCLIP('BBS_'name)='QUICKIN' THEN EXIT
  76.  
  77. sendline=RIGHT(TIME('C'),7) LEFT(DATE(),6)'  IN' name
  78. ADDRESS AREXX bbsLog99.rexx 'QUICK' sendline
  79. x=countcheck('Numbers/QUICKIN' 0)
  80. CALL countcheck('Numbers/QUICKIN' x+1)
  81.  
  82. CALL PRAGMA('P',-1)
  83.  
  84. CALL TIME('R')
  85. CALL SETCLIP('BBS_'name,'QUICKIN')
  86. DO i=1 WHILE GETCLIP('BBS_QUICK_WAIT')~='' | GETCLIP('BBS_UPLOAD')~=''
  87.   CALL DELAY(500)                 /* wait for main filesaves to complete */
  88.   IF TIME('E')>42000 THEN LEAVE i /* don't wait forever */
  89. END
  90. DO i=1
  91.   IF GETCLIP('BBS_QUICKIN'i)='' THEN  /* info clip for external STOP */
  92.     DO
  93.       CALL SETCLIP('BBS_QUICKIN'i,name)
  94.       clipnum=i
  95.       LEAVE i
  96.     END
  97. END
  98. arcfile=bbspath'Emailfiles/'name'/QUICKIN.lha'
  99. savefiles=0
  100. upfiles=-1
  101. upbytes=0
  102. upmail=0
  103. upmsg=''
  104. a.=''
  105. a.0=0
  106.  
  107. lastm=get_last(bbspath'Numbers/LastMail')
  108. CALL CLOSE(STDOUT)
  109. CALL OPEN(STDOUT,bbspath'Email/'name'/BBBBS.'lastm,'W')
  110. SAY ' Mail: 'lastm
  111. SAY ' From: BBBBS'
  112. SAY '   To: 'name
  113. SAY ' Subj: QUICKIN Report'
  114. SAY ' Date: 'DATE('W') DATE() TIME('C')
  115. SAY LEFT('=',75,'=')
  116. SAY 'Here is the log of your QUICKIN file processing.'
  117. SAY STRIP(SUBSTR(SOURCELINE(1),10))
  118. SAY
  119.  
  120. ADDRESS COMMAND 'lha -q t' arcfile
  121. IF RC>0 THEN
  122.   DO
  123.     SAY 'QUICKIN archive is corrupt!  Aborting...'
  124.     SIGNAL DONE
  125.   END
  126.  
  127. CALL MAKEDIR(scratch'/QUICK')
  128. CALL PRAGMA('D',scratch'/QUICK')
  129. ADDRESS COMMAND 'CD' scratch'/QUICK' LF 'lha -mN x' arcfile
  130. SAY
  131.  
  132. CALL check_abort()
  133. CALL do_file_requests()
  134. CALL check_abort()
  135. CALL do_file_deletes()
  136.  
  137. DO i=.001 TO .999 BY .001
  138.   CALL check_abort()
  139.   hdr=RIGHT(i,3)'.HDR'
  140.   IF ~EXISTS(hdr) THEN ITERATE i
  141.   txt=RIGHT(i,3)'.TXT'
  142.   x=OPEN(f,hdr,'R')
  143.   IF x=0 THEN
  144.     DO
  145.       SAY hdr 'failed to open for reading.'
  146.       ITERATE i
  147.     END
  148.   hdr.=''
  149.   DO j=1 TO 6
  150.     hdr.j=READLN(f)
  151.   END
  152.   CALL CLOSE(f)
  153.   IF LEFT(hdr.1,6)='File: ' THEN CALL do_file()
  154.   ELSE IF LEFT(hdr.1,6)='  Msg:' THEN CALL do_msg()
  155.   ELSE IF LEFT(hdr.1,6)=' Mail:' THEN CALL do_mail()
  156.   ELSE
  157.     DO
  158.       SAY
  159.       SAY hdr 'is an unknown header type!'
  160.       DO j=1 TO 6
  161.         SAY hdr.j
  162.         SAY
  163.       END
  164.       ITERATE i
  165.     END
  166.   IF WORDS(SHOWDIR(scratch'/QUICK','F'))=0 THEN LEAVE i
  167. END
  168.  
  169. IF savefiles=1 THEN
  170.   DO
  171.     IF listOPEN(a,bbspath'Lists/Files','W') THEN
  172.       DO
  173.         DO i=1 TO f.0
  174.           IF f.i~='' THEN CALL WRITELN(a,i f.i)
  175.         END
  176.         CALL CLOSE(a)
  177.         SAY 'Updated Lists/Files'
  178.       END
  179.     CALL checkliblists()
  180.     IF ~listOPEN(a,bbspath'Lists/Files.ALPHA','R') THEN
  181.       DO
  182.         SAY 'Could not open Files.ALPHA for reading!'
  183.         CALL GETOUT(22)
  184.       END
  185.     CALL CLOSE(a)
  186.     CALL RENAME(bbspath'Lists/Files.ALPHA',bbspath'Lists/Files.ALPHA.quickin')
  187.     IF OPEN(f,bbspath'Lists/Files.ALPHA.quickin','R')=0 THEN
  188.       DO
  189.         SAY bbspath'Lists/Files.ALPHA.quickin failed to open for reading!'
  190.         CALL GETOUT(23)
  191.       END
  192.     IF listOPEN(a,bbspath'Lists/Files.ALPHA','W') THEN
  193.       DO
  194.         IF a.0>1 THEN CALL QSORT(1,a.0,a)
  195.         acount=1
  196.         DO i=1 TO f.0
  197.           line=READLN(f)
  198.           num=WORD(line,3)
  199.           IF f.num~='' THEN
  200.             DO
  201.               DO WHILE a.acount~='' & UPPER(a.acount)<UPPER(line)
  202.                 CALL WRITELN(a,a.acount)
  203.                 CALL updateliblists(a.acount)
  204.                 acount=acount+1
  205.               END
  206.               acc=acount-1
  207.               IF num~=WORD(a.acc,3) & num~=WORD(a.acount,3) THEN
  208.                 DO
  209.                   CALL WRITELN(a,line)
  210.                   CALL updateliblists(line)
  211.                 END
  212.             END
  213.         END
  214.         CALL CLOSE(f)
  215.         CALL CLOSE(a)
  216.         SAY 'Updated Lists/Files.ALPHA'
  217.         CALL DELETE(bbspath'Lists/Files.ALPHA.quickin')
  218.         CALL closeliblists()
  219.         CALL bbsALPHA.rexx(f.0 'lha lha >'scratch'/junk -2a m')
  220.       END
  221.     IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  222.     IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  223.   END
  224.  
  225. DROP a. f. dirs.
  226.  
  227. CALL check_abort()
  228.  
  229. IF EXISTS(scratch'/QUICK/Files') THEN
  230.   ADDRESS COMMAND 'delete' scratch'/QUICK/Files ALL QUIET'
  231.  
  232. IF EXISTS(scratch'/QUICK/Information') THEN
  233.   DO
  234.     IF level=99 THEN
  235.       ADDRESS COMMAND 'copy' scratch'/QUICK/Information/#?' bbspath'Information'
  236.     ADDRESS COMMAND 'delete' scratch'/QUICK/Information ALL QUIET'
  237.   END
  238. IF EXISTS(scratch'/QUICK/BBS_TEXT') THEN
  239.   DO
  240.     IF level=99 THEN
  241.       ADDRESS COMMAND 'copy' scratch'/QUICK/BBS_TEXT/#?' bbspath'BBS_TEXT'
  242.     ADDRESS COMMAND 'delete' scratch'/QUICK/BBS_TEXT ALL QUIET'
  243.   END
  244. IF EXISTS(scratch'/QUICK/rexxDoors') THEN
  245.   DO
  246.     IF level=99 THEN
  247.       ADDRESS COMMAND 'copy' scratch'/QUICK/rexxDoors/#?' bbspath'rexxDoors ALL'
  248.     ADDRESS COMMAND 'delete' scratch'/QUICK/rexxDoors ALL QUIET'
  249.   END
  250. IF EXISTS(scratch'/QUICK/REXX') THEN
  251.   DO
  252.     IF level=99 THEN
  253.       ADDRESS COMMAND 'copy' scratch'/QUICK/REXX/#? REXX:'
  254.     ADDRESS COMMAND 'delete' scratch'/QUICK/REXX ALL QUIET'
  255.   END
  256. IF EXISTS(scratch'/QUICK/S') THEN
  257.   DO
  258.     IF level=99 THEN
  259.       ADDRESS COMMAND 'copy' scratch'/QUICK/S/#? S:'
  260.     ADDRESS COMMAND 'delete' scratch'/QUICK/S ALL QUIET'
  261.   END
  262. IF EXISTS(scratch'/QUICK/C') THEN
  263.   DO
  264.     IF level=99 THEN
  265.       ADDRESS COMMAND 'copy' scratch'/QUICK/C/#? C:'
  266.     ADDRESS COMMAND 'delete' scratch'/QUICK/C ALL QUIET'
  267.   END
  268. CALL check_abort()
  269. IF EXISTS(scratch'/QUICK/MSG') THEN
  270.   DO
  271.     IF level=99 THEN
  272.       DO
  273.         d=SHOWDIR(scratch'/QUICK/MSG','F')
  274.         DO i=1 TO WORDS(d)
  275.           msg=WORD(d,i)
  276.           PARSE VAR msg 'MSG'conf'.'msgnum
  277.           IF DATATYPE(conf,'W') & DATATYPE(msgnum,'W') THEN
  278.             DO
  279.               newname=msgpath'MSG'conf'/'msgnum
  280.               IF EXISTS(newname) THEN
  281.                 DO
  282.                   SAY newname 'already exists!'
  283.                   ITERATE i
  284.                 END
  285.               x=OPEN(f,scratch'/QUICK/MSG/'msg,'R')
  286.               IF x=0 THEN ITERATE i
  287.               a=READCH(f,65000)
  288.               CALL CLOSE(f)
  289.               a='!!'SUBSTR(a,3)
  290.               x=OPEN(f,newname,'W')
  291.               IF x=0 THEN ITERATE i
  292.               CALL WRITECH(f,a)
  293.               CALL CLOSE(f)
  294.               SAY 'Un-deleted message' msgnum 'in conference' conf
  295.             END
  296.         END
  297.       END
  298.     ADDRESS COMMAND 'delete' scratch'/QUICK/MSG ALL QUIET'
  299.   END
  300. SAY
  301.  
  302. CALL check_abort()
  303.  
  304. IF EXISTS('Super') THEN
  305.   DO
  306.     IF level=99 & EXISTS('Super/Super.rexx') THEN
  307.       DO
  308.         CALL PRAGMA('D','Super')
  309.         SAY 'running Super.rexx...'
  310.         CALL Super.rexx()
  311.         CALL PRAGMA('D','/')
  312.         SAY
  313.       END
  314.     CALL DELETE('Super/Super.rexx')
  315.     CALL DELETE('Super')
  316.   END
  317.  
  318. d=SHOWDIR(scratch'/QUICK','F')
  319. IF d~='' THEN
  320.   DO
  321.     SAY
  322.     SAY 'Unable to process the following files.'
  323.     SAY
  324.     DO i=1 TO WORDS(d)
  325.       SAY
  326.       dname=WORD(d,i)
  327.       SAY 'Filename:' dname
  328.       x=OPEN(f,scratch'/QUICK/'dname,'R')
  329.       IF x=0 THEN
  330.         DO
  331.          SAY dname 'failed to open for reading!'
  332.           ITERATE i
  333.         END
  334.       stuff=READCH(f,65000)
  335.       CALL CLOSE(f)
  336.       CALL WRITECH(STDOUT,stuff)
  337.       CALL DELETE(scratch'/QUICK/'dname)
  338.     END
  339.   END
  340.  
  341. DONE:
  342. abytes=WORD(STATEF(arcfile),2)
  343. CALL DELETE(arcfile)
  344.  
  345. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  346.   DO
  347.     oldmess=GETCLIP('BBS_MESSAGE')
  348.     IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  349.     newmess='Your QUICKIN archive has been processed. A report is waiting in Email.'
  350.     CALL SETCLIP('BBS_MESSAGE',oldmess||newmess)
  351.     IF upfiles>0 | upmail>0 | upmsg~='' THEN
  352.       DO
  353.         CALL SETCLIP(name'_UPDATE',upfiles upbytes upmail upmsg)
  354.         upfiles=0
  355.         upbytes=0
  356.         upmail=0
  357.         upmsg=''
  358.       END
  359.   END
  360.  
  361. IF upfiles>0 | upmail>0 | upmsg~='' THEN
  362.   DO
  363.     x=OPEN(f,bbspath'Users/'name,'R')
  364.     IF x~=0 THEN
  365.       DO
  366.         data.=''
  367.         DO i=1
  368.           line=READLN(f)
  369.           IF EOF(f) THEN LEAVE i
  370.           data.i=line
  371.         END
  372.         CALL CLOSE(f)
  373.         data.0=i-1
  374.         IF upfiles>0 THEN
  375.           DO
  376.             files=WORD(data.14,1)
  377.             bytes=WORD(data.14,3)
  378.             IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  379.             IF ~DATATYPE(bytes,'W') THEN bytes=upbytes
  380.             ELSE IF fromcli THEN
  381.               DO
  382.                 bytes=bytes+upbytes
  383.                 files=files+1
  384.               END
  385.             data.14=upfiles 'files' bytes 'bytes.' DATE()
  386.           END
  387.         IF upmail>0 THEN
  388.           DO
  389.             mail=WORD(data.17,2)
  390.             IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  391.             data.17=WORD(data.17,1) upmail WORD(data.17,3)
  392.           END
  393.         IF upmsg~='' THEN
  394.           DO
  395.             temp=data.23
  396.             data.23=''
  397.             DO i=1 TO level
  398.               msg=WORD(temp,i)
  399.               IF ~DATATYPE(msg,'W') THEN msg=0
  400.               DO j=1 TO WORDS(upmsg)
  401.                 IF WORD(upmsg,j)=i THEN msg=msg+1
  402.               END
  403.               data.23=data.23 msg
  404.             END
  405.           END
  406.         x=OPEN(f,bbspath'Users/'name,'W')
  407.         IF x~=0 THEN
  408.           DO
  409.             DO i=1 TO data.0
  410.               CALL WRITELN(f,data.i)
  411.             END
  412.             CALL CLOSE(f)
  413.             SAY 'User file' name 'updated.'
  414.           END
  415.       END
  416.   END
  417.  
  418. SAY 'QUICKIN archive for' name 'sucessfully processed at' TIME('C')
  419. temp=''
  420. secs=TIME('E')
  421. mins=secs%60
  422. hrs=mins%60
  423. secs=(secs//60)%1
  424. mins=mins//60
  425. IF hrs=1 THEN temp='1 hour'
  426. ELSE IF hrs>0 THEN temp=temp hrs 'hours'
  427. IF mins=1 THEN temp=temp '1 minute'
  428. ELSE IF mins>0 THEN temp=temp mins 'minutes'
  429. IF secs=1 THEN temp=temp '1 second'
  430. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  431. temp=STRIP(temp)
  432. tstamp=hrs':'
  433. IF mins<10 THEN tstamp=tstamp'0'
  434. tstamp=tstamp||mins':'
  435. IF secs<10 THEN tstamp=tstamp'0'
  436. tstamp=LEFT(tstamp||secs,9)
  437. SAY ' - It took' temp 'to process this' abytes 'byte archive -'
  438. sendline=RIGHT(TIME('C'),7) LEFT(DATE(),6)'  IN Elapsed:'
  439. sendline=sendline tstamp||RIGHT(abytes,8) 'bytes from' name
  440. ADDRESS AREXX bbsLog99.rexx 'QUICK' sendline
  441. CALL GETOUT(0)
  442. EXIT
  443.  
  444.  
  445. /* Functions */
  446.  
  447.  
  448. check_abort:
  449. t=GETCLIP('BBS_STOP_QUICKIN'clipnum)
  450. IF t='' THEN RETURN
  451. CALL SETCLIP('BBS_STOP_QUICKIN'clipnum)
  452. SAY 'Aborted at' TIME('C')
  453. IF t='DELETE' THEN
  454.   DO
  455.     CALL DELETE(arcfile)
  456.     ADDRESS COMMAND 'c:delete' scratch'/QUICK/#? ALL'
  457.   END
  458. sendline=RIGHT(TIME('C'),7) LEFT(DATE(),6)'  IN' name
  459. sendline=sendline 'ABORTED!'
  460. ADDRESS AREXX bbsLog99.rexx 'QUICK' sendline
  461. CALL GETOUT(0)
  462. RETURN
  463.  
  464.  
  465. do_file:
  466. PARSE VAR hdr.1 'File:' filenum .'KeyWords: 'keywords 
  467. filename=WORD(hdr.2,2)
  468. IF ~DATATYPE(filenum,'W') & ~EXISTS('Files/'filename) THEN
  469.   DO
  470.     SAY filename 'did not arrive with the QUICKIN archive!'
  471.     RETURN
  472.   END
  473. toname=WORD(hdr.3,2)
  474. lib=WORD(hdr.3,9)
  475. IF load_files() THEN RETURN
  476. IF DATATYPE(filenum,'W') THEN
  477.   DO
  478.     IF f.filenum='' THEN
  479.       DO
  480.         SAY 'File number' filenum '['lib'/'filename'] does not exist!'
  481.         RETURN
  482.       END
  483.     PARSE VAR f.filenum oldlib' 'oldname .
  484.     IF lib='^' THEN lib=oldlib
  485.     IF filename='^' THEN filename=oldname
  486.   END
  487. DO ii=1 TO level
  488.   IF UPPER(lib)=UPPER(dirs.ii) THEN LEAVE ii
  489. END
  490. IF ii>level THEN
  491.   DO
  492.     SAY 'Unknown File Library:' lib 'for' filename
  493.     IF sysoplibnum=0 | DATATYPE(filenum,'W') THEN RETURN
  494.     SAY 'Placing' filename 'in Sysops library.'
  495.     lib='Sysops'
  496.     libnum=sysoplibnum
  497.   END
  498. ELSE libnum=ii
  499. IF DATATYPE(filenum,'W') THEN
  500.   DO
  501.     IF sysoplevel>level THEN RETURN
  502.     subpath=oldlib'/'oldname
  503.     finfo=STATEF(bbspath'FileNotes/'subpath)
  504.     x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  505.     IF x=0 THEN
  506.       DO
  507.         SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  508.         RETURN
  509.       END
  510.     note.=''
  511.     DO ii=1 WHILE ~EOF(f)
  512.       note.ii=READLN(f)
  513.     END
  514.     CALL CLOSE(f)
  515.     note.0=ii
  516.     IF note.ii='' THEN note.0=ii-1
  517.     IF UPPER(lib)~=UPPER(oldlib) | UPPER(filename)~=UPPER(oldname) THEN
  518.       DO
  519.         IF EXISTS(libpath||subpath) THEN
  520.           DO
  521.             ADDRESS COMMAND 'copy' libpath||subpath libpath||lib'/'filename
  522.             CALL DELETE(libpath||subpath)
  523.           END
  524.         comm='copy' bbspath'FileNotes/'subpath
  525.         comm=comm bbspath'FileNotes/'lib'/'filename 'CLONE'
  526.         ADDRESS COMMAND comm
  527.         CALL DELETE(bbspath'FileNotes/'subpath)
  528.         IF UPPER(lib)~=UPPER(oldlib) THEN
  529.           DO
  530.             PARSE VAR note.3 front'Lib:' .
  531.             note.3=front'Lib:' lib
  532.             SAY '  Moved:' filename 'from' oldlib 'to' lib 'library.'
  533.           END
  534.         IF UPPER(filename)~=UPPER(oldname) THEN
  535.           DO
  536.             PARSE VAR note.2 'Name:' . 'Size: 'back
  537.             note.2='Name:' LEFT(filename,27)' Size: 'back
  538.             SAY 'Renamed:' oldname 'to' filename 'in the' lib 'library.'
  539.           END
  540.         f.filenum=lib filename
  541.         CALL DELETE(libpath||lib'/.'STRIP(LEFT(lib,15)))
  542.       END
  543.     IF keywords~='^' THEN
  544.       DO
  545.         PARSE VAR note.1 front'KeyWords:' . 
  546.         note.1=front'KeyWords:' keywords
  547.         SAY 'Changed: KeyWords for' lib'/'filename'.'
  548.       END
  549.     IF toname~=WORD(note.3,2) & toname~='^' THEN
  550.       DO
  551.         PARSE VAR note.3 'From: 'fromname back
  552.         note.3='From:' toname back
  553.         SAY 'Changed: Uploader of' lib'/'filename 'from' fromname 'to' toname'.'
  554.       END
  555.     num=a.0+1
  556.     a.0=num
  557.     PARSE VAR note.1 . 'KeyWords: 'keywords
  558.     a.num=LEFT(filename,22-LENGTH(WORD(note.2,4)))
  559.     a.num=a.num WORD(note.2,4) RIGHT(filenum,5)
  560.     a.num=a.num RIGHT(libnum,2) LEFT(lib,12)
  561.     a.num=a.num STRIP(LEFT(STRIP(keywords),32))
  562.     DO ii=1 TO 4
  563.       hdr.ii=note.ii
  564.     END
  565.     IF EXISTS(txt) THEN
  566.       SAY 'Changed long file description for' lib'/'filename
  567.     ELSE IF note.0>4 THEN
  568.       DO
  569.         x=OPEN(f,txt,'W')
  570.         IF x=0 THEN SAY txt 'failed to open for writing!'
  571.         ELSE
  572.           DO ii=5 TO note.0
  573.             CALL WRITELN(f,note.ii)
  574.           END
  575.         CALL CLOSE(f)
  576.         CALL DELAY(14)
  577.       END
  578.     CALL write_msg(4,bbspath'FileNotes/'lib'/'filename)
  579.   END
  580. ELSE
  581.   DO
  582.     DO ii=1 TO f.0
  583.       IF UPPER(WORD(f.ii,2))=UPPER(filename) THEN
  584.         DO
  585.           SAY filename 'is already here, in the' WORD(f.ii,1) 'library.'
  586.           RETURN
  587.         END
  588.     END
  589.     lastf=get_last(bbspath'Numbers/LastFile')
  590.     IF accessflag & sysoplevel>level THEN lib='Sysops'
  591.     ADDRESS COMMAND 'copy' scratch'/QUICK/Files/'filename libpath||lib
  592.     hdr.1='File:' lastf SUBSTR(hdr.1,13)
  593.     hdr.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'lib
  594.     CALL write_msg(4,bbspath'FileNotes/'lib'/'filename)
  595.     f.lastf=lib filename
  596.     f.0=lastf
  597.     PARSE VAR hdr.1 . 'KeyWords: 'keywords
  598.     num=a.0+1
  599.     a.0=num
  600.     a.num=LEFT(filename,22-LENGTH(WORD(hdr.2,4)))
  601.     a.num=a.num WORD(hdr.2,4) RIGHT(lastf,5)
  602.     a.num=a.num RIGHT(libnum,2) LEFT(lib,12)
  603.     a.num=a.num STRIP(LEFT(STRIP(keywords),32))
  604.     upfiles=upfiles+1
  605.     upbytes=upbytes+WORD(a.num,2)
  606.     newf=bbspath'EMail/'sysop'/NEW_FILES'
  607.     IF EXISTS(newf) THEN ok=OPEN(f,newf,'A')
  608.     ELSE
  609.       DO
  610.         ok=OPEN(f,newf,'W')
  611.         IF ok~=0 THEN CALL WRITELN(f,'*** New Files ***') 
  612.       END
  613.     IF ok~=0 THEN CALL WRITELN(f,name 'uploaded' lib'/'filename'  'DATE() TIME() 'via QUICK')
  614.     CALL CLOSE(f)
  615.     CALL DELETE(libpath||lib'/.'STRIP(LEFT(lib,15)))
  616.     SAY 'Uploaded' filename 'as file' lastf 'in the' lib 'library.'
  617.     IF WORD(lynes.24,1)='1' THEN CALL bbsNewFile.rexx(name libpath||lib'/'filename)
  618.   END
  619. savefiles=1
  620. RETURN
  621.  
  622.  
  623. do_msg:
  624. IF ~EXISTS(txt) THEN
  625.   DO
  626.     SAY txt 'does not exist!'
  627.     RETURN
  628.   END
  629. toname=WORD(hdr.3,2)
  630. conf=WORD(hdr.5,8)
  631. IF conf.0~='' THEN CALL load_conf()
  632. DO ii=1 TO level
  633.   IF UPPER(conf)=UPPER(conf.ii) THEN LEAVE ii
  634. END
  635. IF ii>level THEN
  636.   DO
  637.     SAY 'Unknown Message Conference:' conf
  638.     RETURN
  639.   END
  640. confnum=ii
  641. lastm=get_last(bbspath'Numbers/LastMessage'confnum)
  642. hdr.1='  Msg:' lastm
  643. hdr.5=' Date:' DATE('W') DATE() TIME('C')
  644. hdr.5=LEFT(hdr.5,39) 'Conference:' conf
  645. replynum=WORD(hdr.3,4)
  646. IF DATATYPE(replynum,'W') THEN
  647.   DO
  648.     x=OPEN(f,msgpath'MSG'confnum'/'replynum,'R')
  649.     IF x~=0 THEN
  650.       DO
  651.         data.=''
  652.         DO ii=1 WHILE ~EOF(f)
  653.           data.ii=READLN(f)
  654.         END
  655.         CALL CLOSE(f)
  656.         data.0=ii
  657.         IF data.ii='' THEN data.0=ii-1
  658.         IF WORDS(data.1)>3 THEN data.1=data.1 lastm
  659.         ELSE data.1=data.1'   Reply' lastm
  660.         x=OPEN(f,msgpath'MSG'confnum'/'replynum,'W')
  661.         IF x~=0 THEN
  662.           DO ii=1 TO data.0
  663.             CALL WRITELN(f,data.ii)
  664.           END
  665.         CALL CLOSE(f)
  666.       END
  667.   END
  668. IF write_msg(6,msgpath'MSG'confnum'/'lastm) THEN
  669.   DO
  670.     SAY 'Sent message' lastm 'to' toname 'in the' conf 'conference.'
  671.     upmsg=STRIP(upmsg confnum)
  672.   END
  673. IF ~EXISTS(bbspath'Users/'toname) THEN RETURN
  674. x=OPEN(f,bbspath'Users/'toname,'R')
  675. IF x=0 THEN
  676.   DO
  677.     SAY bbspath'Users/'toname 'failed to open for reading.'
  678.     RETURN
  679.   END
  680. data.=''
  681. DO ii=1 WHILE ~EOF(f)
  682.   data.ii=READLN(f)
  683. END
  684. CALL CLOSE(f)
  685. data.0=ii-1
  686. data.24=data.24 confnum'/'lastm
  687. x=OPEN(f,bbspath'Users/'toname,'W')
  688. IF x=0 THEN
  689.   DO
  690.     SAY bbspath'Users/'toname 'failed to open for writing.'
  691.     RETURN
  692.   END
  693. DO ii=1 TO data.0
  694.   CALL WRITELN(f,data.ii)
  695. END
  696. CALL CLOSE(f)
  697. RETURN
  698.  
  699.  
  700. do_mail:
  701. IF ~EXISTS(txt) THEN
  702.   DO
  703.     SAY txt 'does not exist!'
  704.     RETURN
  705.   END
  706. toname=WORD(hdr.3,2)
  707. mailpath=bbspath'Email/'toname
  708. IF ~EXISTS(mailpath) THEN
  709.   DO
  710.     SAY mailpath 'does not exist, or failed to open!  Unable to send mail.'
  711.     RETURN
  712.   END
  713. lastm=get_last(bbspath'Numbers/LastMail')
  714. PARSE VAR hdr.1 . 'FILE: 'emailfile .
  715. hdr.1=' Mail:' lastm
  716. IF emailfile~='' & EXISTS(scratch'/QUICK/Files/'emailfile) THEN
  717.   hdr.1=hdr.1'    FILE:' emailfile
  718. hdr.5=' Date: 'DATE('W') DATE() TIME('C')
  719. IF write_msg(6,mailpath'/'name'.'lastm) THEN SAY 'Sent email' lastm 'to' toname'.'
  720. IF emailfile~='' & EXISTS(scratch'/QUICK/Files/'emailfile) THEN
  721.   DO
  722.     mailfilepath=bbspath'EmailFiles/'toname
  723.     CALL MAKEDIR(mailfilepath)
  724.     ADDRESS COMMAND 'copy' scratch'/QUICK/Files/'emailfile mailfilepath
  725.     IF WORD(lynes.24,1)='1' THEN
  726.       CALL bbsNewFile.rexx(name scratch'/QUICK/Files/'emailfile)
  727.     hdr.1=hdr.1'    FILE:' emailfile
  728.     SAY '...with attached file;' emailfile
  729.   END
  730. upmail=upmail+1
  731. RETURN
  732.  
  733.  
  734. write_msg:
  735. PARSE ARG hdrstop,ofile
  736. data=''
  737. x=OPEN(f,txt,'R')
  738. IF x=0 THEN
  739.   DO
  740.     IF hdrstop=6 THEN
  741.       DO
  742.         SAY txt 'failed to open for reading.'
  743.         RETURN 0
  744.       END
  745.   END
  746. ELSE data=READCH(f,65000)
  747. CALL CLOSE(f)
  748. x=OPEN(f,ofile,'W')
  749. IF x=0 THEN
  750.   DO
  751.     SAY ofile 'failed to open for writing.'
  752.     RETURN 0
  753.   END
  754. DO ii=1 TO hdrstop
  755.   CALL WRITELN(f,hdr.ii)
  756. END
  757. IF data~='' THEN CALL WRITECH(f,data)
  758. CALL CLOSE(f)
  759. CALL DELETE(hdr)
  760. CALL DELETE(txt)
  761. RETURN 1
  762.  
  763.  
  764. load_files:
  765. IF DATATYPE(f.0,'W') THEN RETURN 0
  766. CALL load_libs()
  767. f.=''
  768. IF ~listOPEN(a,bbspath'Lists/Files','R') THEN RETURN 1
  769. f.0=0
  770. DO ii=1 WHILE ~EOF(a)
  771.   line=READLN(a)
  772.   num=WORD(line,1)
  773.   IF DATATYPE(num,'W') THEN
  774.     DO
  775.       f.num=WORD(line,2) WORD(line,3)
  776.       IF num>f.0 THEN f.0=num
  777.     END
  778. END
  779. CALL CLOSE(a)
  780. RETURN 0
  781.  
  782.  
  783. do_file_requests:
  784. fr='File_Requests'
  785. IF EXISTS(fr) THEN
  786.   DO
  787.     x=OPEN(f,fr,'R')
  788.     IF x=0 THEN
  789.       DO
  790.         SAY fr 'failed to open for reading!'
  791.         RETURN
  792.       END
  793.     fr.=''
  794.     DO i=1 WHILE ~EOF(f)
  795.       fr.i=READLN(f)
  796.     END
  797.     CALL CLOSE(f)
  798.     fr.0=i
  799.     IF fr.i='' THEN fr.0=i-1
  800.     IF load_files() THEN RETURN
  801.     selected=''
  802.     DO i=1 TO fr.0
  803.       num=fr.i
  804.       IF DATATYPE(num,'W') THEN
  805.         DO
  806.           IF f.num='' THEN
  807.             DO
  808.               SAY 'File Number' num 'does not exist!'
  809.               ITERATE i
  810.             END
  811.           subpath=WORD(f.num,1)'/'WORD(f.num,2)
  812.           finfo=STATEF(bbspath'FileNotes/'subpath)
  813.           IF finfo~='' THEN
  814.             DO
  815.               x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  816.               IF x=0 THEN
  817.                 DO
  818.                   SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  819.                   ITERATE i
  820.                 END
  821.               note.=''
  822.               DO j=1 WHILE ~EOF(f)
  823.                 note.j=READLN(f)
  824.               END
  825.               CALL CLOSE(f)
  826.               note.0=j
  827.               IF note.j='' THEN note.0=j-1
  828.               PARSE VAR note.2 line'Downloads: 'num .
  829.               IF DATATYPE(num,'W') THEN
  830.                 DO
  831.                   note.2=line'Downloads:' num+1
  832.                   x=OPEN(f,bbspath'FileNotes/'subpath,'W')
  833.                   IF x=0 THEN
  834.                     DO
  835.                       SAY bbspath'FileNotes/'subpath 'failed to open for updating!'
  836.                       ITERATE i
  837.                     END
  838.                   DO j=1 TO note.0
  839.                     CALL WRITELN(f,note.j)
  840.                   END
  841.                   CALL CLOSE(f)
  842.                 END
  843.               ELSE
  844.                 DO
  845.                   SAY 'Unable to PARSE filenote' subpath 'for download count.'
  846.                   SAY note.2
  847.                 END
  848.             END
  849.           IF EXISTS(libpath||subpath) THEN
  850.             selected=STRIP(selected libpath||subpath)
  851.           ELSE IF WORDS(finfo)>7 THEN
  852.             DO
  853.               comment=SUBSTR(finfo,WORDINDEX(finfo,8))
  854.               IF EXISTS(comment) THEN selected=STRIP(comment selected)
  855.             END
  856.           ELSE SAY subpath 'is missing!  Unable to archive for download.'
  857.         END
  858.       ELSE IF fr.i~='' THEN
  859.         SAY 'Unknown file request!' fr.i  'Unable to archive for download.'
  860.     END
  861.     SAY
  862.     SAY 'Selected file request list:'
  863.     DO i=1 TO WORDS(selected)
  864.       SAY WORD(selected,i)
  865.     END
  866.     SAY
  867.     ADDRESS AREXX bbsArcExt.rexx name selected
  868.     CALL DELETE(fr)
  869.     SAY 'File Requests have been passed to the file archiver...'
  870.     SAY
  871.     CALL DELAY(100)
  872.   END
  873. RETURN
  874.  
  875.  
  876. do_file_deletes:
  877. fr='File_Deletes'
  878. IF ~EXISTS(fr) THEN RETURN
  879. x=OPEN(f,fr,'R')
  880. IF x=0 THEN
  881.   DO
  882.     SAY fr 'failed to open for reading!'
  883.     RETURN
  884.   END
  885. fr.=''
  886. DO i=1 WHILE ~EOF(f)
  887.   fr.i=READLN(f)
  888.   dels=STRIP(dels fr.i)
  889. END
  890. CALL CLOSE(f)
  891. fr.0=i
  892. IF fr.i='' THEN fr.0=i-1
  893. IF load_files() THEN RETURN
  894. DO i=1 TO fr.0
  895.   num=fr.i
  896.   IF DATATYPE(num,'W') THEN
  897.     DO
  898.       IF f.num='' THEN
  899.         DO
  900.           SAY 'File Number' num 'does not exist to delete!'
  901.           ITERATE i
  902.         END
  903.       dlib=WORD(f.num,2)
  904.       subpath=WORD(f.num,1)'/'dlib
  905.       finfo=STATEF(bbspath'FileNotes/'subpath)
  906.       IF sysoplevel>level THEN
  907.         DO
  908.           x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  909.           IF x=0 THEN
  910.             DO
  911.               SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  912.               ITERATE i
  913.             END
  914.           CALL READLN(f)
  915.           CALL READLN(f)
  916.           from=WORD(READLN(f),2)
  917.           CALL CLOSE(f)
  918.           IF name~=from THEN
  919.             DO
  920.               SAY subpath 'not deleted.'
  921.               SAY 'You may only delete files you have uploaded yourself.'
  922.               ITERATE i
  923.             END
  924.         END
  925.       IF EXISTS(libpath||subpath) THEN
  926.         DO
  927.           IF DELETE(libpath||subpath)=0 THEN
  928.             SAY 'Failed to delete' libpath||subpath
  929.         END
  930.       ELSE IF WORDS(finfo)>7 THEN
  931.         DO
  932.           comment=SUBSTR(finfo,WORDINDEX(finfo,8))
  933.           IF EXISTS(comment) THEN
  934.             IF DELETE(comment)=0 THEN SAY 'Failed to delete' comment
  935.         END
  936.       ELSE SAY subpath 'is missing!  Unable to delete.'
  937.       IF DELETE(bbspath'FileNotes/'subpath)=0 THEN
  938.         SAY 'Failed to delete' bbspath'FileNotes/'subpath
  939.       f.num=''
  940.       savefiles=1
  941.       CALL DELETE(libpath||dlib'/.'STRIP(LEFT(dlib,15)))
  942.       SAY 'Deleted' subpath', file number' num'.'
  943.     END
  944.   ELSE IF STRIP(fr.i)~='' THEN SAY 'Unknown delete request!' fr.i
  945. END
  946. SAY
  947. CALL DELETE(fr)
  948. RETURN
  949.  
  950.  
  951. load_libs:
  952. sysoplibnum=0
  953. dirs.=''
  954. IF ~listOPEN(a,bbspath'Lists/Libraries','R') THEN CALL GETOUT(24)
  955. DO ii=1
  956.   line=READLN(a)
  957.   IF EOF(a) | line='END' THEN LEAVE ii
  958.   num=WORD(line,1)
  959.   IF DATATYPE(num,'W') THEN
  960.     DO
  961.       num=num%1
  962.       IF num>0 & num<100 THEN
  963.         DO
  964.           dirs.num=WORD(line,2)
  965.           IF UPPER(dirs.num)='SYSOPS' THEN sysopslibnum=num
  966.         END
  967.     END
  968. END
  969. CALL CLOSE(a)
  970. RETURN
  971.  
  972.  
  973. load_conf:
  974. conf.=''
  975. IF ~listOPEN(a,bbspath'Lists/Conferences','R') THEN CALL GETOUT(25)
  976. conf.=''
  977. DO ii=1
  978.   line=READLN(a)
  979.   IF EOF(a) | line='END' THEN LEAVE ii
  980.   num=WORD(line,1)
  981.   IF DATATYPE(num,'W') THEN
  982.     DO
  983.       num=num%1
  984.       IF num>0 & num<100 THEN conf.num=WORD(line,2)
  985.     END
  986. END
  987. CALL CLOSE(a)
  988. RETURN
  989.  
  990.  
  991. do_user_change:
  992. uc='User_Changes'
  993. IF ~EXISTS(uc) THEN RETURN
  994. x=OPEN(f,uc,'R')
  995. IF x=0 THEN
  996.   DO
  997.     SAY uc 'failed to open for reading!'
  998.     RETURN
  999.   END
  1000. uc.=''
  1001. DO i=1 WHILE ~EOF(f)
  1002.   uc.i=READLN(f)
  1003. END
  1004. CALL CLOSE(f)
  1005. uc.0=i
  1006. IF uc.i='' THEN uc.0=i-1
  1007. DO i=1 TO uc.0
  1008.   PARSE VAR uc.i uname mins lev exc
  1009.   x=OPEN(f,bbspath'Users/'uname,'R')
  1010.   IF x=0 THEN
  1011.     DO
  1012.       SAY uname 'does not appear to be a member of' bbsname
  1013.       ITERATE i
  1014.     END
  1015.   DO j=1
  1016.     line=READLN(f)
  1017.     IF EOF(f) THEN LEAVE j
  1018.     data.j=line
  1019.   END
  1020.   CALL CLOSE(f)
  1021.   data.0=j-1
  1022.   IF DATATYPE(mins,'W') THEN data.11=mins 'minutes' calls 'more calls today.'
  1023.   IF DATATYPE(lev,'W') THEN data.20=lev
  1024.   IF STRIP(exc)~='' THEN data.21=exc
  1025.   x=OPEN(f,bbspath'Users/'uname,'W')
  1026.   IF x=0 THEN
  1027.     DO
  1028.       SAY uname 'did not open for writing!'
  1029.       ITERATE i
  1030.     END
  1031.   DO j=1 TO data.0
  1032.     CALL WRITELN(f,data.j)
  1033.   END
  1034.   CALL CLOSE(f)
  1035. END
  1036. CALL DELETE(uc)
  1037. RETURN
  1038.  
  1039.  
  1040. get_last:
  1041. PARSE ARG statname
  1042. x=OPEN(f,statname,'R')
  1043. IF x=0 THEN
  1044.   DO
  1045.     SAY statname 'failed to open for reading!'
  1046.     RETURN 0
  1047.   END
  1048. last=READLN(f)
  1049. CALL CLOSE(f)
  1050. IF DATATYPE(last,'W') THEN last=last+1
  1051. ELSE RETURN 0
  1052. OPTIONS FAILAT 20
  1053. ADDRESS COMMAND 'ECHO >'statname last
  1054. RETURN last
  1055.  
  1056.  
  1057. listOPEN:
  1058. PARSE ARG fh,listfile,flag
  1059. CALL CLOSE(fh)
  1060. DO i=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  1061.   IF i//4=0 THEN SAY 'Waiting' (60-i)*5 'more seconds for' listfile 'to become available...'
  1062.   CALL DELAY(250)
  1063. END
  1064. IF i>59 THEN
  1065.   DO
  1066.     line='*** unable to access' listfile 'list.'
  1067.     SAY line
  1068.     RETURN 0
  1069.   END
  1070. RETURN 1
  1071.  
  1072.  
  1073. checkliblists:
  1074. SAY 'Checking individual library filelists...'
  1075. liblist=''
  1076. lastlib=0
  1077. cnt.=0
  1078. DO i=1 TO 99
  1079.   IF dirs.i='' THEN ITERATE i
  1080.   IF ~EXISTS(libpath||dirs.i'/.'STRIP(LEFT(dirs.i,15))) THEN liblist=liblist i
  1081. END
  1082. liblist=STRIP(liblist)
  1083. DO j=1 TO WORDS(liblist)
  1084.   tt=WORD(liblist,j)
  1085.   CALL MAKEDIR(libpath||dirs.tt)
  1086.   lf=libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15))
  1087.   flg='W'
  1088.   IF EXISTS(libpath||dirs.tt'.txt') THEN
  1089.     DO
  1090.       ADDRESS COMMAND 'COPY' libpath||dirs.tt'.txt' lf
  1091.       flg='A'
  1092.     END
  1093.   IF listOPEN(f,lf,flg)=0 THEN ITERATE j
  1094.   IF flg='A' THEN CALL WRITELN(f,'')
  1095.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  1096.   CALL WRITELN(f,LEFT('=',77,'='))
  1097.   CALL CLOSE(f)
  1098. END
  1099. RETURN
  1100.  
  1101.  
  1102. updateliblists:
  1103. PARSE ARG alpha 
  1104. x=FIND(liblist,WORD(alpha,4))
  1105. IF x=0 THEN RETURN
  1106. tt=WORD(liblist,x)
  1107. IF tt~=lastlib THEN
  1108.   DO
  1109.     CALL CLOSE(b)
  1110.     lastlib=tt
  1111.     IF OPEN(b,libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)),'A')=0 THEN
  1112.       DO
  1113.         lastlib=0
  1114.         RETURN
  1115.       END
  1116.   END
  1117. CALL WRITELN(b,alpha)
  1118. cnt.tt=cnt.tt+1
  1119. RETURN
  1120.  
  1121.  
  1122. closeliblists:
  1123. CALL CLOSE(b)
  1124. DO i=1 TO WORDS(liblist)
  1125.   tt=WORD(liblist,i)
  1126.   dname='.'STRIP(LEFT(dirs.tt,15))
  1127.   SAY ' 'dname
  1128.   x=OPEN(f,libpath||dirs.tt'/'dname,'A')
  1129.   IF x~=0 THEN
  1130.     DO
  1131.       CALL WRITELN(f,LEFT('-',77,'-'))
  1132.       temp='file'
  1133.       IF cnt.tt>1 THEN temp=temp's'
  1134.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  1135.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  1136.       CALL WRITELN(f,temp)
  1137.       CALL CLOSE(f)
  1138.     END
  1139.   CALL MAKEDIR(bbspath'FileNotes/'dirs.tt)
  1140.   fnote=bbspath'FileNotes/'dirs.tt'/'dname
  1141.   lynes.=''
  1142.   lynes.0=5
  1143.   x=OPEN(f,fnote,'R')
  1144.   IF x~=0 THEN
  1145.     DO
  1146.       DO k=1
  1147.         line=READLN(f)
  1148.         IF EOF(f) THEN LEAVE k
  1149.         lynes.k=line
  1150.       END
  1151.       CALL CLOSE(f)
  1152.       lynes.0=k-1
  1153.     END
  1154.   finfo=STATEF(libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)))
  1155.   bt=WORD(finfo,2)
  1156.   dl=WORD(lynes.2,7)
  1157.   IF ~DATATYPE(dl,'W') THEN dl=0
  1158.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  1159.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  1160.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'dirs.tt
  1161.   lynes.4=LEFT('',74,'=')
  1162.   IF lynes.5='' THEN
  1163.     lynes.5='Up to the minute alphabetical filelist of the' dirs.tt 'library.'
  1164.   IF OPEN(f,fnote,'W')~=0 THEN
  1165.     DO
  1166.       DO k=1 TO lynes.0
  1167.         CALL WRITELN(f,lynes.k)
  1168.       END
  1169.       CALL CLOSE(f)
  1170.       SAY LEFT(' ',LENGTH(dname)+2)'1B'x'Mupdated.'
  1171.     END
  1172. END
  1173. RETURN
  1174.  
  1175.  
  1176. countcheck:
  1177. PARSE ARG fname' 'cknum .
  1178. fname=bbspath||fname
  1179. IF ~EXISTS(fname) THEN
  1180.   DO
  1181.     IF cknum=0 THEN RETURN 0
  1182.     IF OPEN(f,fname,'W')=0 THEN RETURN 0
  1183.     CALL WRITELN(f,cknum)
  1184.     CALL CLOSE(f)
  1185.     RETURN cknum
  1186.   END
  1187. IF OPEN(f,fname,'R')=0 THEN
  1188.   DO
  1189.     CALL DELAY(99)
  1190.     IF OPEN(f,fname,'R')=0 THEN RETURN cknum
  1191.   END
  1192. retval=STRIP(READLN(f))
  1193. CALL CLOSE(f)
  1194. IF ~DATATYPE(retval,'W') THEN retval=0
  1195. IF ~DATATYPE(cknum,'W') THEN cknum=0
  1196. IF retval<cknum THEN
  1197.   DO
  1198.     IF OPEN(f,fname,'W')~=0 THEN
  1199.       DO
  1200.         CALL WRITELN(f,cknum)
  1201.         CALL CLOSE(f)
  1202.         RETURN cknum
  1203.       END
  1204.   END
  1205. RETURN retval
  1206.  
  1207.  
  1208. GETOUT:
  1209. ARG err 
  1210. IF err>0 THEN SAY 'Error:' err'  RC='RC'  SIGL='SIGL
  1211.  
  1212. ERROR:
  1213. SYNTAX:
  1214. BREAK_C:
  1215. FAILURE:
  1216. IF RC>0 THEN SAY 'RC='RC'  SIGL='SIGL
  1217. IF GETCLIP('BBS_'name)='QUICKIN' THEN CALL SETCLIP('BBS_'name)
  1218. CALL SETCLIP('BBS_QUICKIN'clipnum)
  1219. EXIT err
  1220.  
  1221. /* bbsQUICKIN.rexx */
  1222.